#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
获取 Gitee 组织所有仓库及其贡献者信息
"""

import requests
import json
import time
import os
from dotenv import load_dotenv # 导入 load_dotenv 函数

def get_all_paginated_data(url, headers, params=None):
    """
    通用函数，处理 API 分页，获取所有数据。
    """
    all_data = []
    page = 1
    per_page = 100 # Gitee API 建议的最大分页数
    
    while True:
        current_params = params.copy() if params else {}
        current_params['page'] = page
        current_params['per_page'] = per_page

        try:
            response = requests.get(url, headers=headers, params=current_params)
            response.raise_for_status()  # 如果状态码不是 2xx，则抛出异常
            data = response.json()
            all_data.extend(data)
            
            # 如果返回的数据量小于每页限制，说明已是最后一页
            if len(data) < per_page:
                break
            
            page += 1
            # 增加延迟，避免触发 API 限流
            time.sleep(0.5) 
            
        except requests.exceptions.RequestException as e:
            print(f"请求出错: {e}")
            return None
    
    return all_data


def get_organization_repos(org_name, headers):
    """
    获取指定组织的所有仓库。
    """
    print(f"正在获取组织 '{org_name}' 的所有仓库...")
    repos_url = f"https://gitee.com/api/v5/orgs/{org_name}/repos"
    
    repos = get_all_paginated_data(repos_url, headers)
    if repos:
        print(f"成功获取 {len(repos)} 个仓库。")
    return repos


def get_repo_contributors(repo_full_name, headers):
    """
    获取指定仓库的所有贡献者。
    """
    contributors_url = f"https://gitee.com/api/v5/repos/{repo_full_name}/contributors"
    
    contributors = get_all_paginated_data(contributors_url, headers)
    if contributors:
        print(f"  成功获取 {len(contributors)} 个贡献者。")
    return contributors


def main():
    # 从 .env 文件中加载环境变量
    load_dotenv()
    
    # 从环境变量中获取 Gitee 个人访问令牌
    access_token = os.getenv("GITEE_ACCESS_TOKEN")
    
    # 检查是否成功获取到令牌
    if not access_token:
        print("错误：未找到 GITEE_ACCESS_TOKEN。请确保在同级目录下有名为 .env 的文件，并且其中包含 GITEE_ACCESS_TOKEN=你的令牌。")
        return
        
    headers = {
        'Authorization': f'token {access_token}'
    }
    
    organization_name = "spark-store-project"

    # 1. 获取组织所有仓库
    repos = get_organization_repos(organization_name, headers)
    
    if repos is None:
        print("无法获取仓库列表，请检查 API 令牌和网络连接。")
        return
        
    print("\n--- 正在处理每个仓库的贡献者 ---")    
    for i, repo in enumerate(repos):
        repo_full_name = repo['full_name']
        print(f"[{i + 1}/{len(repos)}] 仓库: {repo_full_name}")
        
        # 2. 获取当前仓库的所有贡献者
        contributors = get_repo_contributors(repo_full_name, headers)
        
        if contributors:
            for contributor in contributors:
                # 尝试获取用户名，如果获取不到，则尝试获取提交者邮箱
                user_info = contributor.get('login')
                if not user_info:
                    user_info = contributor.get('email', 'N/A')
                
                print(f"  - 用户名: {user_info}, 贡献次数: {contributor.get('contributions', 'N/A')}")
        else:
            print(f"  该仓库没有贡献者数据或获取失败。")
            
        print("-" * 20)

    print("\n所有仓库贡献者信息获取完毕。")


if __name__ == "__main__":
    main()